<?php
    namespace Core\ORM\Attributs;
    /**
     * Un objet DateTime peut être un Date ou un Time
     *
     * @author mpetrini
     */
    class DateTime extends Attribut {
        /**
        * @var string $format Format que l'on veut utiliser pour cette DateTime
        */
        protected $format;
        /**
        * Constructeur complet
        * 
        * @param string $nom
        * @param boolean $primary (optional) (default=false)
        * @param string $format
        * @param string $type
        * 
        * @return void
        */
        public function __construct($nom, $primary=false, $format = 'Y-m-d H:i:s', $type = 'datetime') {
            $this->format=$format;
            parent::__construct($nom, $primary, 0);
            $this->type=$type;
        }
        /**
        * Permet le formalisme d'une valeur
        *
        * @param mixed
        * 
        * @return mixed 
        */
        public function getValeur($valeur) {
            return \Utils\Outils::getterDate($valeur, $this->format);
        }
        /**
        * Retourne la chaine qui permet de déclarer 
        *
        * @return string
        */
        public function getChaineDeclaration() {
            return "new ".get_class($this)."(\"".$this->nom."\", ".var_export($this->primary, true).", \"".$this->format."\", \"".$this->type."\")";
        }
        /**
        * Retourne le type documenté pour phpDocumentor
        * 
        * @return string
        */
        public function getTypeDocumente() {
            return "\DateTime";
        }
        /**
        * Retourne le Getter de cet Attribut
        * 
        * @return string
        */
        public function creationGetter() {
            return  "\t\t/**\n".
                    "\t\t* Getter de l'attribut ".$this->getNomAttribut()."\n".
                    "\t\t*\n".
                    "\t\t* @return ".$this->getTypeDocumente()."\n".
                    "\t\t*/\n".
                    "\t\tpublic function get".\Utils\Outils::toCamelCase($this->getNomAttribut(), true)."(\$format=\"".$this->format."\") {\n".
                    "\t\t\treturn \Utils\Outils::getterDate(\$this->".$this->getNomAttribut().", \$format);\n".
                    "\t\t}\n";
        }
        /**
        * Retourne le Setter de cet Attribut
        * 
        * @return string
        */
        public function creationSetter() {
            return  "\t\t/**\n".
                    "\t\t* Setter de l'attribut ".$this->getNomAttribut()."\n".
                    "\t\t*\n".
                    "\t\t* @return void\n".
                    "\t\t*/\n".
                    "\t\tpublic function set".ucfirst(\Utils\Outils::toCamelCase($this->getNomAttribut()))."(\$".$this->getNomAttribut().") {\n".
                    "\t\t\t\$this->".$this->getNomAttribut()."=\Utils\Outils::setterDate(\$".$this->getNomAttribut().");\n".
                    "\t\t}\n";
        }
        /**
        * Crée la ligne de déclaration dans une reqûete de BDD
        * 
        * @return string
        */
        public function creationDeclarationCreateTable() {
            $attributs = $this->getAttributDeclarationCreateTable();
            return $this->nom." ".strtoupper($this->type)." ".$attributs["null"]." ".$attributs["defaut"]." ".$attributs["commentaires"];
        }
    }
?>